package rpc

import (
	"bytes"
	"encoding/gob"
)

// RPCData 定义数据格式和编解码 ==> 最初简版实现
type RPCData struct {
	// 访问的函数
	Name string
	// 访问时传的参数
	Args []interface{}
}

// Request 定义rpc请求数据格式和编解码
type Request struct {
	// 访问的函数
	Name string
	// 访问时传的参数
	Args []interface{}
}

// Response 定义rpc响应数据格式和编解码
type Response struct {
	StatusCode        int           // status code, 0 -> success, -1 -> error, 404 -> method not exists,
	RequestTimestamp  int64         // get request timestamp
	ResponseTimestamp int64         // out response timestamp
	Err               string        // error if exists
	Args              []interface{} // response body
}

// 编码: data Request / Response
func encode(data interface{}) ([]byte, error) {
	var buf bytes.Buffer
	// 得到字节数组的编码器
	bufEnc := gob.NewEncoder(&buf)
	// 对数据进行编码 //bufEnc.Encode(data)
	if err := bufEnc.Encode(data); err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}

// 解码
func decode(b []byte) (RPCData, error) {
	buf := bytes.NewBuffer(b)
	// 返回字节数组的解码器
	bufDec := gob.NewDecoder(buf)
	var data RPCData
	// 对数据解码
	if err := bufDec.Decode(&data); err != nil {
		return data, nil
	}
	return data, nil
}

// decodeRequest decode rpc Request request
func decodeRequest(data []byte) (Request, error) {
	buf := bytes.NewBuffer(data)
	// 返回字节数组的解码器
	bufDecode := gob.NewDecoder(buf)
	// 对rpc请求数据解码
	var request Request
	if err := bufDecode.Decode(&request); err != nil {
		return Request{}, err
	}
	return request, nil
}

// decodeResponse decode rpc Response response
func decodeResponse(data []byte) (Response, error) {
	buf := bytes.NewBuffer(data)
	// 返回字节数组的解码器
	bufDecode := gob.NewDecoder(buf)
	// 对rpc响应数据解码
	var response Response
	if err := bufDecode.Decode(&response); err != nil {
		return Response{}, err
	}
	return response, nil
}
